STM32F103做主控自制无刷电机(BLDC)控制器 有感/无感 |
您所在的位置:网站首页 › stm32f103 foc算法 › STM32F103做主控自制无刷电机(BLDC)控制器 有感/无感 |
源文件地址:https://download.csdn.net/download/snail_dongbin/10681696 STM32F103做主控自制无刷电机(BLDC)控制器 支持 有感/无感 两种模式 2018年9月21日 星期五 snail_dongbin 先来秀个板子外观,100*60mm 中等大小。DC 12V输入,设计最大电流10A. (实际没试过那么大的电机,手头的电机也就5 6A的样子) 硬件上可以切换有感(HALL)和无感(EMF)两种模式,外部滑动变阻器调速 预留有 PWM输入、刹车、正反转、USB和uart等接口。 先来说下原理无刷电机其实就是直流电机,和传统的dc电机是一样的,只是把有刷的电滑环变成了电子换向器。 具体参考网络介绍 https://blog.csdn.net/dddxxxx/article/details/52564571
当然难点就在如何获取当前转子的位置好换相,所以又分为两种 有感和无感。 有感就是在电机端盖的部位加装霍尔传感器分别相隔30度或60度。 无感就是靠检测悬浮相的感应电动势过零点(后面在细讲)。 当然各有各的优缺点,有感在低速方面好,可以频繁启停换相。无感的结构简单成本低,航模上应用居多。 先说有感,电源首先被分成了3个绕组 U V W这个交流电还是有区别的。 它只是3个h桥按一定的顺序导通模拟出来的,本质还是直流电。 电机靠hall位置按一定顺序换相,转速与电压电流有关。这一点切记,不是换的越快转的越快。(位置决定换相时刻,电压决定转速)一般调速就是调电压,6步pwm方式是目前常用的。当然后续还有foc等更好算法。 硬件部分网上基本都是成熟的方案。三相H桥,H桥一般有上臂mos和下臂mos组成,如果只是简单的做演示上臂选pmos下臂选nmos控制电路简单直接用单片机的io就可以驱动。但是pmos低内阻的价格高。功率上面很难做大。 这也就是为什么基本所有的商业控制器全是nmos的原因。 但是上臂用nmos存在一个问题vgs控制电压大与vcc 4v以上才能完全导通。为了简化电路采用了ir公司出的驱动ic,它内部有自举升压电路。外部仅需一个续流的二极管及储能电容即可。 有感模式控制相对简单,3个霍尔传感器输出一般都是数字信号,分压后直接接单片机io.
switch(step) { case 4: //B+ C- /* Next step: Step 2 Configuration -------------------------------------- */ TIM_CCxCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCxN_Disable); /* Channel1 configuration */ /* Channel2 configuration */ TIM_SetCompare2(BLDC_TIMx,BLDC_TIM_PERIOD); TIM_CCxCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCx_Enable); /* Channel3 configuration */ TIM_SetCompare3(BLDC_TIMx,BLDC_TIM_PERIOD*speed_duty/1000); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCxN_Enable); break; case 5: //B+ A- /* Next step: Step 3 Configuration -------------------------------------- */ TIM_CCxCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCxN_Disable); /* Channel1 configuration */ TIM_SetCompare1(BLDC_TIMx,BLDC_TIM_PERIOD*speed_duty/1000); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCxN_Enable); /* Channel2 configuration */ TIM_SetCompare2(BLDC_TIMx,BLDC_TIM_PERIOD); TIM_CCxCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCx_Enable); /* Channel3 configuration */ break; case 1: //C+ A- /* Next step: Step 4 Configuration -------------------------------------- */ TIM_CCxCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCxN_Disable); /* Channel1 configuration */ TIM_SetCompare1(BLDC_TIMx,BLDC_TIM_PERIOD*speed_duty/1000); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCxN_Enable); /* Channel2 configuration */ /* Channel3 configuration */ TIM_SetCompare3(BLDC_TIMx,BLDC_TIM_PERIOD); TIM_CCxCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCx_Enable); break; case 3: //C+ B- /* Next step: Step 5 Configuration -------------------------------------- */ TIM_CCxCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCxN_Disable); /* Channel1 configuration */ /* Channel2 configuration */ TIM_SetCompare2(BLDC_TIMx,BLDC_TIM_PERIOD*speed_duty/1000); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCxN_Enable); /* Channel3 configuration */ TIM_SetCompare3(BLDC_TIMx,BLDC_TIM_PERIOD); TIM_CCxCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCx_Enable); break; case 2: //A+ B- /* Next step: Step 6 Configuration -------------------------------------- */ TIM_CCxCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCxN_Disable); /* Channel1 configuration */ TIM_SetCompare1(BLDC_TIMx,BLDC_TIM_PERIOD); TIM_CCxCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCx_Enable); /* Channel2 configuration */ TIM_SetCompare2(BLDC_TIMx,BLDC_TIM_PERIOD*speed_duty/1000); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCxN_Enable); /* Channel3 configuration */ break; case 6: //A+ C- /* Next step: Step 1 Configuration -------------------------------------- */ TIM_CCxCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCxN_Disable); /* Channel1 configuration */ TIM_SetCompare1(BLDC_TIMx,BLDC_TIM_PERIOD); TIM_CCxCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCx_Enable); /* Channel2 configuration */ /* Channel3 configuration */ TIM_SetCompare3(BLDC_TIMx,BLDC_TIM_PERIOD*speed_duty/1000); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCxN_Enable); break; default: TIM_CCxCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCxN_Disable); TIM_CCxCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_2,TIM_CCxN_Disable); TIM_CCxCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCx_Disable); TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_3,TIM_CCxN_Disable); break;} 下图为uvw三相的霍尔检测到的电平及w相的波形。
下图为 w相电平, w相上臂on 下臂pwm ,w相霍尔信号。 在这里插入图片描述 在说说无感模式,由于没有了霍尔,电机无法知道转子当前的位置所以就无法换相,而感应电动势也只有在转起来之后才有,所以无感模式的启动是个难点。 一般方法都是分三段法 ,1 预定位 2 启动 3进入闭环反馈 正如网友说的江湖一层纸,戳破不值半文钱。 1 预定为就是强制给某一相通电一段时间,让电机定位到这个位置。 占空比30-50%不要太大,可能会发热。 2 启动,就是逐步的强制换相,当然要有个加速的过程,使电机转起来。 这个过程太慢会抖动反转,太快会丢步。参数需要一点点试,有点像控制步进电机。要能使电机转的能产生电动势,我也是参照的德国MK 电调的算法 每次延时时间比上一次少1/25,形成一个加速的过程,直到电机完全转起来产生足够的电动势。 3 闭环反馈控制换相跟有感差不多一样。 speed_duty=30; //30% start BLDC_PHASE_CHANGE(Step[Phase]); //固定一相 Delay_MS(200); speed_duty=pwm; timer = 300; while(1) { for(i=0;i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |